package com.cy.detectsys.util;

import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class RSAKeyGenerator {

    /**
     * 生成RSA密钥对。
     *
     * @return 密钥对对象，包含公钥和私钥
     * @throws NoSuchAlgorithmException 如果RSA算法不可用
     */
    public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException {
        // RSA密钥生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // 密钥长度，通常为1024或2048位
        keyPairGenerator.initialize(2048);

        // 生成密钥对
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 将密钥转换为Base64编码的字符串。
     *
     * @param key 密钥对象
     * @return Base64编码的密钥字符串
     */
    public static String getKeyString(Key key) {
        return Base64.getEncoder().encodeToString(key.getEncoded());
    }


    public static void main(String[] args) throws Exception {

        // 生成RSA密钥对
        KeyPair keyPair = generateRSAKeyPair();

        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // 打印公钥和私钥
        System.out.println("公钥: " + getKeyString(publicKey));
        System.out.println("私钥: " + getKeyString(privateKey));

        // 如果需要将密钥持久化存储，可以使用getKeyString方法获取Base64编码的字符串
        // 然后可以将这些字符串保存到文件或数据库中

        // 生成RSA密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);


        // 将公钥和私钥转换成字符串格式，以便存储或传输
        String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());

        // 加载公钥和私钥
        PublicKey loadedPublicKey = RSAUtil.loadPublicKey(publicKeyString);
        PrivateKey loadedPrivateKey = RSAUtil.loadPrivateKey(privateKeyString);

        // 需要加密的原始数据
        String originalData = "Hello, RSA encryption!";

        // 用公钥加密数据
        byte[] encryptedData = RSAUtil.encrypt(originalData.getBytes(), loadedPublicKey);
        System.out.println("加密后的数据: " + Base64.getEncoder().encodeToString(encryptedData));

        // 用私钥解密数据
        byte[] decryptedData = RSAUtil.decrypt(encryptedData, loadedPrivateKey);
        System.out.println("解密后的数据: " + new String(decryptedData));

        // 验证解密后的数据是否与原始数据相同
        if (originalData.equals(new String(decryptedData))) {
            System.out.println("数据解密成功，且与原始数据一致！");
        } else {
            System.out.println("数据解密失败，与原始数据不一致！");
        }
    }
}